﻿using System;

namespace Loki.Utils
{
    /// <summary>
    /// Interface for loggers.
    /// </summary>
    public interface ILog
    {
        #region Debug
        /// <summary>
        /// Logs the specified debug info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        void Debug(string P_Message);

        /// <summary>
        /// Logs the specified debug info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The Exception.</param>
        void Debug(string P_Message, Exception P_Exception);

        /// <summary>
        /// Logs the specified debug info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Args">The Args.</param>
        void DebugFormat(string P_Message, params object[] P_Args);

        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The exception.</param>
        /// <param name="P_Args">The Args.</param>
        void DebugFormat(string P_Message, Exception P_Exception, params object[] P_Args);
        #endregion

        #region Error
        /// <summary>
        /// Logs the specified error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        void Error(string P_Message);

        /// <summary>
        /// Logs the specified error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The Exception.</param>
        void Error(string P_Message, Exception P_Exception);

        /// <summary>
        /// Logs the specified error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Args">The Args.</param>
        void ErrorFormat(string P_Message, params object[] P_Args);

        /// <summary>
        /// Logs the specified error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The exception.</param>
        /// <param name="P_Args">The Args.</param>
        void ErrorFormat(string P_Message, Exception P_Exception, params object[] P_Args);
        #endregion

        #region Fatal
        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        void Fatal(string P_Message);

        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The Exception.</param>
        void Fatal(string P_Message, Exception P_Exception);

        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Args">The Args.</param>
        void FatalFormat(string P_Message, params object[] P_Args);

        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The exception.</param>
        /// <param name="P_Args">The Args.</param>
        void FatalFormat(string P_Message, Exception P_Exception, params object[] P_Args);
        #endregion

        #region Info
        /// <summary>
        /// Logs the specified info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        void Info(string P_Message);

        /// <summary>
        /// Logs the specified info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The Exception.</param>
        void Info(string P_Message, Exception P_Exception);

        /// <summary>
        /// Logs the specified info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Args">The Args.</param>
        void InfoFormat(string P_Message, params object[] P_Args);

        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The exception.</param>
        /// <param name="P_Args">The Args.</param>
        void InfoFormat(string P_Message, Exception P_Exception, params object[] P_Args);
        #endregion

        #region Warn
        /// <summary>
        /// Logs the specified debug info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        void Warn(string P_Message);

        /// <summary>
        /// Logs the specified debug info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The Exception.</param>
        void Warn(string P_Message, Exception P_Exception);

        /// <summary>
        /// Logs the specified debug info.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Args">The Format parameters.</param>
        void WarnFormat(string P_Message, params object[] P_Args);

        /// <summary>
        /// Logs the specified fatal error.
        /// </summary>
        /// <param name="P_Message">The Message.</param>
        /// <param name="P_Exception">The Exception.</param>
        /// <param name="P_Args">The Format parameters.</param>
        void WarnFormat(string P_Message, Exception P_Exception, params object[] P_Args);
        #endregion
    }
}
